iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
0
Modern Web

用30天了解javascript系列 第 14

[用30天了解javascript]Day14.傳值與傳參考

  • 分享至 

  • xImage
  •  

傳值(call by value)

  • 在javascript裡純值(boolean、null、undefined、number、string)是傳值
  • 傳過去沒有任何關聯,是複製的方式
var a = 20;
var b = a;
console.log(a); //20
console.log(b); //20
console.log(a === b); //true
a = 30;
console.log(a); //30
console.log(b); //20
  1. 宣告一個變數a,值等於1,便存放在記憶體位置中(0x01)
  2. 把變數a指向變數b時,會建立一個新的記憶體位置(0x02),並複製一個值給b變數
  3. 然後又改變了變數a,值等於30
  4. 結果a=30; b=20;
    為何b不會改變呢?因為a與b的記憶體位置不同,所以修改a時,b不會受影響

傳參考(call by reference)

  • 在javascript裡物件型別(陣列、函式)是傳參考
  • 對實體物件重新賦予值,另一個變數不會一起變更
var user = {
	name: 'John',
	age: 35
}
var user2 = user;
console.log(user); //{name: "John", age: 35}
console.log(user2); //{name: "John", age: 35}
console.log(user === user2); //true
user2.name = 'Jay';
console.log(user); //{name: "Jay", age: 35}
console.log(user2); //{name: "Jay", age: 35}
user2 = {
	name: 'Jay',
	age: 35
}
console.log(user); //{name: "Jay", age: 35}
console.log(user2); //{name: "Jay", age: 35}
console.log(user === user2); //false
user2.name = 'Jason';
console.log(user); //{name: "Jay", age: 35}
console.log(user2); //{name: "Jason", age: 35}
  1. 宣告一個變數user,值等於物件,變數會指向記憶體中的位置(0x01),取得裡面的內容
  2. 宣告user2等於變數user,會把變數user參考位址,一模一樣的傳給user2(0x01),共用的是同一個位址
  3. 把user2的name改為'Jay',因為user及user2共用是同一位址,因此name改變了會同時修改
  4. user2指向一個新物件,雖然內容一樣,但會產生一個新的參考位置(0x002),所以user ≠ user2,更改值也不會有影響

上一篇
[用30天了解javascript]Day13.物件
下一篇
[用30天了解javascript]Day15.範圍鍊(Scope Chain)
系列文
用30天了解javascript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言